package controller;

import interfaz.TDAManejoDatos;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
import javax.swing.JOptionPane;

import xmlService.CotizacionXmlService;
import xmlService.OrdenDePedidoXmlService;
import xmlService.SolicitudCotizacionXmlService;
import beans.CotizacionBean;
import beans.EntidadBean;
import beans.OrdenDePedidoBean;
import beans.FacturaBean;
import beans.RodamientoBean;
import beans.SolicitudCotizacionBean;

/*
 CotizacionBean cot = new CotizacionBean();
 cot.setCliente(s.getCliente());
 ReferenciaSolicitudCotizacionBean ref =  new ReferenciaSolicitudCotizacionBean();
 ref.setSolicitudCotizacion(new ReferenciaSimpleBean(s.getNumero(), s.getFecha()));
 cot.setReferenciaSolicitudCotizacion(ref);
 cot.setVigencia(new VigenciaBean(FechaUtil.getStringFromSqlDate(Calendar.getInstance().getTime()), 30));*/

public class ControllerPrincipal {
	private static ControllerPrincipal instancia;
	private static String hostname = "localhost";
	private static int odv;
	TDAManejoDatos rmiController;

	/*
	 * public static void main(String[] args) throws Exception {//
	 * ControllerPrincipal p = new ControllerPrincipal();
	 * p.cargarSolicitudCotizacion(); }
	 */
	public static ControllerPrincipal getInstancia() {
		if (instancia == null) {
			instancia = new ControllerPrincipal();
		}
		return instancia;
	}

	public ControllerPrincipal() {
		// instancia = this;
		getStub();
	}

	private boolean getStub() {
		try {
			rmiController = (TDAManejoDatos) Naming.lookup("//" + hostname
					+ "/rmiController");
			System.out.println("GetStub");
			return true;
		} catch (Exception e) {
			// e.printStackTrace();
			System.out.println("No se pudo conectar al server");
			JOptionPane.showMessageDialog(null,
					"Error no se puedo conectar al server \n " + "//"
							+ hostname + "/rmiController");
		}
		return false;
	}

	public boolean validarClienteExistenteByCuil(String cuitCliente)
			throws Exception {
		try {
			return rmiController.existeClienteByCuil(cuitCliente);
		} catch (RemoteException e) {
			generarMensajeError(e);
			return false;
		}
	}

	private void generarMensajeError(Exception e) {
		e.printStackTrace();
		JOptionPane.showMessageDialog(null,
				"Ocurrio un Error con el servidor: \n " + "//" + hostname
						+ "/rmiController");
	}

	public void cargarSolicitudCotizacion() throws Exception {

		SolicitudCotizacionBean s = SolicitudCotizacionXmlService
				.cargarSolicitudCotizacion();
		cargarSolicitudCotizacion(s);
	}

	public void cargarSolicitudCotizacion(SolicitudCotizacionBean s)
			throws Exception {

		if (rmiController.existeClienteByCuil(s.getCliente().getCuil())) {
			List<RodamientoBean> aCotizar = new LinkedList<RodamientoBean>();
			List<RodamientoBean> validos = rmiController
					.getRodamientosValidos();
			for (RodamientoBean solicitado : s.getRodamientos()) {
				int indice = validos.indexOf(solicitado);
				RodamientoBean aAgregar = null;
				if (indice == -1) {
					aAgregar = obtenerRodamientoSimilar(solicitado, validos);
				} else {
					aAgregar = validos.get(indice);
				}
				aAgregar.setCantidad(solicitado.getCantidad());
				aCotizar.add(aAgregar);
			}

			s.setRodamientos(new Vector(aCotizar));

			s = rmiController.crearSolicitudCotizacion(s, this.odv);
			// LLamo a generar cotizacion
			CotizacionXmlService.guardarCotizacioin(generarCotizacion(s));
		}

	}

	private RodamientoBean obtenerRodamientoSimilar(RodamientoBean solicitado,
			List<RodamientoBean> validos) throws Exception {
		for (RodamientoBean r : validos) {
			if (r.getSerie().equals(solicitado.getSerie())) {
				return r;
			}
		}
		throw new Exception(
				"No se pudo realizar el pedido de cotizacion porque no hay Rodamientos Validos con Nro de Serie:"
						+ solicitado.getSerie());
	}

	private List<RodamientoBean> obtenerRodamientosSimilares(
			RodamientoBean solicitado, List<RodamientoBean> validos)
			throws Exception {
		List<RodamientoBean> rodamientos = new LinkedList<RodamientoBean>();
		for (RodamientoBean r : validos) {
			if (r.getSerie().equals(solicitado.getSerie())) {
				rodamientos.add(r);
			}
		}
		return rodamientos;
	}

	private CotizacionBean generarCotizacion(SolicitudCotizacionBean s)
			throws Exception {
		return rmiController.generarCotiacion(s);
	}

	public void cargarOrdenPedido() throws Exception {
		rmiController.registrarOrdenDePedido(
				OrdenDePedidoXmlService.cargarOdenDePedido(), this.odv);
	}

	public void cargarOrdenPedido(OrdenDePedidoBean op) throws Exception {
		rmiController.registrarOrdenDePedido(op, this.odv);
	}

	public void AltaCliente(EntidadBean eb) throws Exception {
		rmiController.altaCliente(eb);
	}

	public List<EntidadBean> obtenerClientesActivos() throws Exception {
		return rmiController.getClientesActivos();
	}

	public boolean validarODV(String text) throws Exception {
		// TODO Auto-generated method stub

		return rmiController.validarODVExistente(new Integer(text));
	}

	public void eliminarCliente(EntidadBean cliente) throws Exception {
		rmiController.eliminarCliente(cliente);
	}

	public EntidadBean buscarCliente(String s) throws Exception {
		return rmiController.buscarCliente(s);
	}

	public static int getOdv() {
		return odv;
	}

	public static void setOdv(Integer odv) {
		ControllerPrincipal.odv = odv;
	}

	public void modificarCliente(EntidadBean cliente, String iva,
			String razonSocial) throws Exception {
		rmiController.modificarCliente(cliente, iva, razonSocial);

	}

	public List<EntidadBean> obtenerProveedoresActivos() throws Exception {
		return rmiController.getProveedoresActivos();
	}

	public List<CotizacionBean> getCotizacionesPendientes() throws Exception {
		return rmiController.getCotizacionesByOdv(getOdv());
	}
	public List<FacturaBean> obtenerFacturas() throws Exception {
		return rmiController.getFacturas();
	}
	
}
